package com.yueqian.java;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * Lambda表达式的使用
 * <p>
 * 1.举例：（o1,o2）-> Integer.compare(o1,o2);
 * 2.格式：
 * ->:Lambda操作符 或 箭头操作符
 * ->:左边：lambda形参列表（其实就是接口中的抽象方法形参列表）
 * ->:右边：lambda体 （其实就是重写的抽象方法的方法体）
 * <p>
 * 3.lambda表达式的使用：（分为6种情况介绍）
 * <p>
 * 总结：
 * ->左边：lambda表达式形参列表的参数类型可以省略（类型推断），如果形参列表只有一个形参，小括号也可以省略
 * ->右边：lambda表达式应该使用一对{}包裹，如果lambda体只有一条执行语句（可能是return语句），省略大括号和return
 * <p>
 * 4、lambda表达式的本质：作为接口的实例
 * <p>
 * 5.如果一个接口中，只声明了一个抽象方法，则此接口就成为函数式接口   我们可以在一个接口上方加@Funcation检验这个接口是否是函数式接口
 * <p>
 * 6.所以以前用匿名实现类表示的 现在都可以用lambda表达式来写
 *
 * @author shkstart
 * @create 2021-02-24 9:13
 */
public class LambdaTest {
    @Test
    //语法格式一：无参，无返回值
    public void test1() {
        Runnable r1 = () -> {
            System.out.println("hello");

        };
    }

    //语法格式二：lambda需要一个参数但是没有返回值
    @Test
    public void test2() {
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("谎言和誓言有什么区别呢");
        System.out.println("********************");

        Consumer<String> c2 = (String s) -> System.out.println(s);

        c2.accept("一个是听的人当真了，一个是说的人当真了");
    }

    //语法格式三：数据类型可以省略，因为可由编译器推断得出，称为“类型推断”
    @Test
    public void test3() {
        Consumer<String> consumer2 = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);

            }
        };
        consumer2.accept("吴杰是猪");

        Consumer<String> consumer = (String s) -> System.out.println(s);

        consumer.accept("飞翔的鸟");
        System.out.println("**************");

        Consumer<String> consumer1 = (s) -> System.out.println(s);
        consumer1.accept("吴杰是猪");
    }

    //语法格式四：lambda若只需要一个参数时，参数的小括号可以省略
    @Test
    public void test4() {

        Consumer<String> consumer = s -> System.out.println(s);
        consumer.accept("吴杰是狗");
    }

    //语法格式五：lambda需要两个或以上的参数，多条执行语句，并且可以有返回值
    @Test
    public void test5() {

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(comparator.compare(15, 523));

        System.out.println("**********************");

        Comparator<Integer> con = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(con.compare(12, 3));

    }

    //语法格式六：当lambda体只有一条语句时，return与大括号若有，都可以省略
    @Test
    public void test6() {
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };
        System.out.println(com.compare(12, 32));
        System.out.println("****************");

        Comparator<Integer> comparator = (o1, o2) -> o1.compareTo(o2);
        System.out.println(comparator.compare(12, 44));

    }


}

